<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="Ibq6d" id="Ibq6d"><span data-lake-id="u7411002f" id="u7411002f">典型回答</span></h1>
  <p data-lake-id="u183d1258" id="u183d1258"><br></p>
  <p data-lake-id="u5b6cf751" id="u5b6cf751"><span data-lake-id="ueea02f40" id="ueea02f40">死锁是指两个或两个以上的进程（或线程）在执行过程中，由于竞争资源或者由于彼此通信而造成的一种阻塞的现象，若无外力作用，它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁，这些永远在互相等待的进程称为死锁进程。</span></p>
  <p data-lake-id="u886a755d" id="u886a755d"><span data-lake-id="u4bed8d71" id="u4bed8d71">​</span><br></p>
  <p data-lake-id="u28b1bb53" id="u28b1bb53"><span data-lake-id="ub70b0ecf" id="ub70b0ecf">比如：丈母娘要求先买房才能结婚，但是女婿说先结婚买房</span></p>
  <p data-lake-id="u5184f3a1" id="u5184f3a1"><span data-lake-id="uf2e9a6e9" id="uf2e9a6e9">​</span><br></p>
  <h1 data-lake-id="YC8IK" id="YC8IK"><span data-lake-id="u41df5bed" id="u41df5bed">扩展知识</span></h1>
  <p data-lake-id="u616a845a" id="u616a845a"><br></p>
  <h2 data-lake-id="P120f" id="P120f"><span data-lake-id="u4ac0eaaf" id="u4ac0eaaf">产生死锁的四个必要条件</span></h2>
  <p data-lake-id="uc26d0a36" id="uc26d0a36"><strong><span data-lake-id="ud39c5f01" id="ud39c5f01">（1） 互斥条件：</span></strong><span data-lake-id="uf5becfa9" id="uf5becfa9">一个资源每次只能被一个进程使用。</span></p>
  <p data-lake-id="ufda805cb" id="ufda805cb"><strong><span data-lake-id="u5679f90b" id="u5679f90b">（2） 占有且等待：</span></strong><span data-lake-id="uc70d72d4" id="uc70d72d4">一个进程因请求资源而阻塞时，对已获得的资源保持不放。</span></p>
  <p data-lake-id="u4a834189" id="u4a834189"><strong><span data-lake-id="udfd9a751" id="udfd9a751">（3）不可强行占有：</span></strong><span data-lake-id="ub067123e" id="ub067123e">进程已获得的资源，在末使用完之前，不能强行剥夺。</span></p>
  <p data-lake-id="u242be75f" id="u242be75f"><strong><span data-lake-id="u8e21277d" id="u8e21277d">（4） 循环等待条件：</span></strong><span data-lake-id="u0d90b3df" id="u0d90b3df">若干进程之间形成一种头尾相接的循环等待资源关系。</span></p>
  <p data-lake-id="u5b6e77bd" id="u5b6e77bd"><span data-lake-id="ua51e8627" id="ua51e8627">​</span><br></p>
  <h2 data-lake-id="jJ5Xj" id="jJ5Xj"><span data-lake-id="u799f19b9" id="u799f19b9">如何解除死锁</span></h2>
  <p data-lake-id="ua4064d46" id="ua4064d46"><br></p>
  <p data-lake-id="u4bfbf9ee" id="u4bfbf9ee"><span data-lake-id="uaac60424" id="uaac60424">想好解除和预防死锁，就避免4个条件同时发生就行了，一般从以下几个方面入手</span></p>
  <p data-lake-id="uc2f46d74" id="uc2f46d74"><span data-lake-id="u72156999" id="u72156999">​</span><br></p>
  <p data-lake-id="ufa3c3247" id="ufa3c3247"><span data-lake-id="u1d01355c" id="u1d01355c">破坏不可抢占：设置优先级，使优先级高的可以抢占资源</span></p>
  <p data-lake-id="u5659f4ba" id="u5659f4ba"><span data-lake-id="ud1fd7a7e" id="ud1fd7a7e">​</span><br></p>
  <p data-lake-id="uf8402c7c" id="uf8402c7c"><span data-lake-id="u94adf04a" id="u94adf04a">破坏循环等待：保证多个进程（线程）的执行顺序相同即可避免循环等待。</span></p>
  <p data-lake-id="ud141cb68" id="ud141cb68"><span data-lake-id="u3c8deea4" id="u3c8deea4">如执行顺序都是：A-&gt;B-&gt;C，那就可以避免循环等待。</span></p>
  <p data-lake-id="u66ff2eef" id="u66ff2eef"><span data-lake-id="ue1f6055e" id="ue1f6055e">最常用的避免方法就是破坏循环等待，就是当我们有多个事务的时候，最好让这几个事务的执行顺序相同。</span></p>
  <p data-lake-id="u5d375286" id="u5d375286"><span data-lake-id="u07a5dc7a" id="u07a5dc7a">如事务1：A-&gt;B-&gt;C ，事务2：C-&gt;D-&gt;A，这种情况就有可能导致死锁。</span></p>
  <p data-lake-id="uac02f7d8" id="uac02f7d8"><span data-lake-id="uf7b0ea9d" id="uf7b0ea9d">即事务1占有了A，等待C，而事务2占有了C在等待A。</span></p>
  <p data-lake-id="u42d85b6f" id="u42d85b6f"><span data-lake-id="u51ff3d7e" id="u51ff3d7e">所以，要避免死锁就把事务2改为：A -&gt; D-&gt; C。</span></p>
  <p data-lake-id="u32f63d57" id="u32f63d57"><span data-lake-id="u45248752" id="u45248752">​</span><br></p>
  <p data-lake-id="ue3e74573" id="ue3e74573"><span data-lake-id="u7f3af5f8" id="u7f3af5f8">​</span><br></p>
  <h2 data-lake-id="JFz8M" id="JFz8M"><span data-lake-id="ud3be014e" id="ud3be014e">数据库死锁的发生</span></h2>
  <p data-lake-id="u09dc83c1" id="u09dc83c1"><br></p>
  <p data-lake-id="u8075acf8" id="u8075acf8"><span data-lake-id="u1e0c6498" id="u1e0c6498">在数据库中，如果有多个事务并发执行，也是可能发生死锁的。当事务1持有资源A的锁，但是尝试获取资源B的锁，而事务2持有资源B的锁，尝试获取资源A的锁的时候，这时候就会发生死锁的情况。</span></p>
  <p data-lake-id="u0b7d8fd2" id="u0b7d8fd2"><span data-lake-id="ubf801128" id="ubf801128">​</span><br></p>
  <p data-lake-id="u2d8b7668" id="u2d8b7668"><span data-lake-id="u07321c0d" id="u07321c0d">发生死锁时，会发生如下异常：</span></p>
  <p data-lake-id="uaa16d0af" id="uaa16d0af"><span data-lake-id="uacb6c5c1" id="uacb6c5c1">​</span><br></p>
  <pre lang="java"><code>
Error updating database. Cause: ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] 

Deadlock found when trying to get lock; 

</code></pre>
  <p data-lake-id="u1a0a63ec" id="u1a0a63ec"><br></p>
  <p data-lake-id="u0f0a6c1f" id="u0f0a6c1f"><span data-lake-id="uaa1a5112" id="uaa1a5112">一般对于数据库的死锁，主要是避免发生并发修改。</span><strong><span data-lake-id="u56de0654" id="u56de0654">或者可以考虑保证操作的顺序，比如多个事务都是先操作资源A、再操作资源B，这样就能有效的避免死锁。</span></strong></p>
  <p data-lake-id="u7cf6883e" id="u7cf6883e"><strong><span data-lake-id="u8156bc92" id="u8156bc92">​</span></strong><br></p>
 </body>
</html>